'use strict';

const fs = require('fs');
const path = require('path');
const utils = require('./utils');
const routes = require('./routes');
const redisConnect = require('./service/redis')
const socketConect = require('./service/socket');
const paasRequest = require('./service/paasRequest');
const authenticator = require('./middlewares/authenticator');
const clickHouseClient = require('./service/clickHouseClient');
const kafka = require('./service/kafka');
const schedule = require('./schedule');
const apiLog = require('./middlewares/api-log');


module.exports.entry = function (app, router, opts) {
  app.fs.logger.log('info', '[FS-AUTH]', 'Inject auth and api mv into router.');

  app.fs.api = app.fs.api || {};
  app.fs.opts = opts || {};
  app.fs.utils = app.fs.utils || {};
  app.fs.api.authAttr = app.fs.api.authAttr || {};
  app.fs.api.logAttr = app.fs.api.logAttr || {};

  // 顺序固定 ↓
  redisConnect(app, opts)
  socketConect(app, opts);

  // 实例其他平台请求方法
  paasRequest(app, opts);

  // clickHouse 数据库 client
  clickHouseClient(app, opts);

  // 工具类函数
  utils(app, opts);

  // 定时任务
  schedule(app, opts);

  //鉴权中间件
  router.use(authenticator(app, opts));

  //kafka
  // kafka(app, opts);

  // 日志记录
  router.use(apiLog(app, opts));

  router = routes(app, router, opts);
};

module.exports.models = function (dc) {
  // dc = { orm: Sequelize对象, ORM: Sequelize, models: {} }

  // 模型关系摘出来 初始化之后再定义关系才行
  fs.readdirSync(path.join(__dirname, '/models')).forEach((filename) => {
    require(`./models/${filename}`)(dc);
  });

  const {
    PatentInfo,
    SoftwareCopyright,
    Trademark,
  } = dc.models;

};
